package union;

import tools.Times;

/**
 * @Author: LDeng
 * @Date: 2021-03-31 9:20
 */
public class Main {

    static final int count=1000000;

    public static void main(String[] args) {
//        test(new UnionFind_QF(12));
//        test(new UnionFind_QU(12));
//        test(new UnionFind_QU_S(12));
//        test(new UnionFind_QU_R(12));
//        test(new UnionFind_QU_R_PC(12));

//        testTime(new UnionFind_QF(count));
//        testTime(new UnionFind_QU(count));
//        testTime(new UnionFind_QU_S(count));
//        testTime(new UnionFind_QU_R(count));
//        testTime(new UnionFind_QU_R_PC(count));
//        testTime(new UnionFind_QU_R_PS(count));
//        testTime(new UnionFind_QU_R_PH(count));
//        GenericUnionFind<Student> uf=new GenericUnionFind<>();
        testTime(new GenericUnionFind<Integer>());
//        Student stu1 = new Student(1, "111");
//        Student stu2 = new Student(2, "222");
//        Student stu3 = new Student(3, "333");
//        Student stu4 = new Student(4, "444");
//        uf.makeSet(stu1);
//        uf.makeSet(stu2);
//        uf.makeSet(stu3);
//        uf.makeSet(stu4);
//
//        uf.union(stu1,stu2);
//        uf.union(stu3,stu4);
//
//        uf.union(stu2,stu3);
//
//        System.out.println(uf.isSame(stu1,stu2));
//        System.out.println(uf.isSame(stu3, stu4));
//        System.out.println(uf.isSame(stu1, stu4));

    }

    static void test(UnionFind uf){
        uf.union(0,1);
        uf.union(0,3);
        uf.union(0,4);
        uf.union(2,3);
        uf.union(2,5);

        uf.union(6,7);

        uf.union(8,10);
        uf.union(9,10);
        uf.union(9,11);

        uf.union(2,7);
        uf.union(6,11);

        System.out.println(uf.isSame(1,10));
    }

    static void testTime(GenericUnionFind<Integer> uf){

        for (int i = 0; i < count; i++) {
            uf.makeSet(i);
        }
        Times.test(uf.getClass().getSimpleName(),()->{
            for (int i = 0; i < count; i++) {
                uf.union((int)Math.random()*count,(int)Math.random()*count);
            }
            for (int i = 0; i < count; i++) {
                uf.isSame((int)Math.random()*count,(int)Math.random()*count);
            }
        });


    }
}
